import {Layout} from '@react-spectrum/docs';
export default Layout;

import docs from 'docs:@react-spectrum/provider';
import {HeaderInfo, PropTable, PageDescription, TypeLink} from '@react-spectrum/docs';
import packageData from '@react-spectrum/provider/package.json';

```jsx import
import {Checkbox} from '@react-spectrum/checkbox';
import {TextField} from '@react-spectrum/textfield';
import {Flex} from '@react-spectrum/layout';
import {Picker, Item} from '@react-spectrum/picker';
import {ActionButton} from '@react-spectrum/button';
import {RadioGroup, Radio} from '@react-spectrum/radio';
import {View} from '@react-spectrum/view';
```

---
category: Application
keywords: [theme, locale, application, colorstop]
---

# Provider

<PageDescription>{docs.exports.Provider.description}</PageDescription>

<HeaderInfo
  packageData={packageData}
  componentNames={['Provider', 'useProvider']}
  since="3.0.0" />

## Example

```tsx example
import {Provider} from '@react-spectrum/provider';
import {theme} from '@react-spectrum/theme-default';
import {Button} from '@react-spectrum/button';

function App() {
  return (
    <Provider theme={theme}>
      <Button variant="accent">
        Hello React Spectrum!
      </Button>
    </Provider>
  );
}
```

## Application provider

A Provider must be the root component of your application. All other React Spectrum components rely on the Provider to define the theme, locale, and other settings that they need in order to render.

### Themes
In order to provide the styling attributes that components need to render, you must pass a theme as a prop to the root provider in your application. Themes consist of a light and dark color scheme, along with medium and large platform scales. By default, React Spectrum will select the color scheme according to the user’s operating system setting, and the scale according to the device type (e.g. touch vs mouse input). To read more details about how theming works in React Spectrum, see the [theming docs](theming.html).

### Color Schemes
We recommend supporting both light and dark color schemes in your app, however, if you need to override this with an application specific setting, you can use the `colorScheme` prop.

```tsx example
<Provider theme={theme} colorScheme="light">
  <ActionButton margin="size-100">I'm a light button</ActionButton>
</Provider>
```

See the [styling docs](styling.html) for more information about using Spectrum color variables in your app to ensure it adapts to light and dark mode properly.

### Locales
Another important setting for your application is the locale. By default, React Spectrum chooses the locale matching the user’s browser/operating system language, but this can be overridden with the locale prop if you have an application specific setting. This prop accepts a [BCP 47](https://www.ietf.org/rfc/bcp/bcp47.txt) language code. A list of supported locales is available [here](react-aria:quality#internationalization#supported-locales).


```tsx
<Provider theme={theme} locale={appSettings.locale}>
  <YourApp />
</Provider>
```

To access the current locale anywhere in your application, see the [useLocale](react-aria:useLocale) hook.

### Breakpoints

The Provider component can also be used to set the responsive breakpoints for your application, which are used by [layout components](layout.html#responsive-layout) and [style props](styling.html#responsive-styles) of all components within the Provider. By default, React Spectrum provides 5 breakpoints, which correspond to common device resolutions:

* S – 640px
* M - 768px
* L – 1024px
* XL - 1280px
* XXL - 1536px

These breakpoints can be overridden by passing the `breakpoints` prop to the `Provider` component. Any components within the Provider will consume these breakpoints and apply their style props accordingly. By default, React Spectrum uses t-shirt style names for breakpoints, but you can name custom breakpoints however you like.

This example specifies two breakpoints: `tablet` and `desktop`. It displays a [View](View.html) that changes color depending on which breakpoint is matched: green by default, blue at the `tablet` breakpoint, and magenta at the `desktop` breakpoint. See the docs for [style props](styling.html#responsive-styles) for more details.

```tsx example
<Provider theme={theme} breakpoints={{tablet: 640, desktop: 1024}}>
  <View height="size-1000" backgroundColor={{base: 'celery-600', tablet: 'blue-600', desktop: 'magenta-600'}} />
</Provider>
```

### Client side routing

The Provider component accepts an optional `router` prop. This enables React Spectrum components that render links to perform client side navigation using your application or framework's client side router. See the [client side routing guide](routing.html) for details on how to set this up.

```tsx
let navigate = useNavigateFromYourRouter();

<Provider theme={theme} router={{navigate}}>
  <YourApp />
</Provider>
```

## Property groups
Provider can also be used to define common properties for a group of components within it. For example, a group of components could be disabled together rather than individually by setting the `isDisabled` prop on any parent provider.

```tsx example
<Flex direction="column" gap="size-100" alignItems="start">
  <Provider isDisabled>
    <RadioGroup label="Favorite animal">
      <Radio value="dogs">Dogs</Radio>
      <Radio value="cats">Cats</Radio>
      <Radio value="horses">Horses</Radio>
    </RadioGroup>
    <Checkbox>I agree</Checkbox>
    <Button variant="primary">Submit</Button>
  </Provider>
</Flex>
```

Provider supports many other properties that can be used in this way: `isQuiet`, `isEmphasized`, `isDisabled`, `isRequired`, `isReadOnly`, and `validationState`. These will be applied to any child components that support them.

Property groups can also be nested. For example, a group of components could be made quiet or emphasized, with a sub-group that is also disabled. The inner-most provider will override outer ones, as will corresponding props on the components themselves.

The following example shows a registration form, which disables a picker and submit button until an email address is entered. All elements within the form use a quiet style, except the submit button, which overrides the provider setting using a prop.

```tsx example
function Register() {
  let [email, setEmail] = React.useState('');

  return (
    <Flex direction="column" gap="size-100" alignItems="start">
      <Provider isQuiet>
        <TextField
          label="Email"
          value={email}
          onChange={setEmail} />
        <Provider isDisabled={email.length === 0}>
          <Picker label="Favorite color">
            <Item key="magenta">Magenta</Item>
            <Item key="indigo">Indigo</Item>
            <Item key="chartreuse">Chartreuse</Item>
          </Picker>
          <Button variant="primary">Submit</Button>
        </Provider>
      </Provider>
    </Flex>
  );
}
```

## Props

<PropTable component={docs.exports.Provider} links={docs.links} />

## useProvider
The <TypeLink links={docs.links} type={docs.exports.useProvider} /> hook can be used to access the various properties applied by the nearest parent Provider. This can be useful for adapting a custom component to the current color scheme or scale.

The example below uses the `colorScheme` returned from `useProvider` to display either a moon or sun icon depending on the current color scheme. Toggle the theme using the switcher in the top right corner of the page to see the icon change.

```tsx example
import Light from '@spectrum-icons/workflow/Light';
import Moon from '@spectrum-icons/workflow/Moon';
import {useProvider} from '@react-spectrum/provider';

function Example() {
  let {colorScheme} = useProvider();

  return colorScheme === 'dark'
    ? <Moon aria-label="In dark theme" />
    : <Light aria-label="In light theme" />
}

<Example />
```
